ALB のヘルスチェックが “Health checks failed with these codes:[XXX]” で失敗する原因と対処法を教えてください
困っていた内容
ALB(Application Load Balancer)を構築しましたが、ターゲットグループのヘルスチェックステータスが unhealthy となり、詳細に "Health checks failed with these codes:[XXX]" と表示されています。 これを解決するには、どの設定を確認すればよいでしょうか?
どう対応すればいいの?
上記のメッセージは ALB からターゲット EC2 ヘ送信されるヘルスチェックリクエストに対し、ターゲット EC2 側から [XXX]
の部分に表示されたHTTPステータスコードが返されていることを示します。
ALB ヘルスチェックには「成功コード」が設定されており、これと異なるステータスコードが EC2 側から連続して返されるとヘルスチェック失敗となります。これを解決するには、指定した「成功コード」が返されるように EC2 内部の設定を見直す必要があります。
以下に例を示します。
現在の設定はヘルスチェックの詳細画面で確認できます。
上記設定の場合「ヘルスチェックに成功するには EC2 上のパス "/" (ドキュメントルート)へHTTPでアクセスした時に、常にステータスコード 200 が返却される必要がある」ということを意味しています。この条件を満たしていないとヘルスチェックエラーになります。
ターゲット EC2 内部の設定を確認し、エラーメッセージに表示されたステータスコード [XXX]
の原因を解決して、200 が返るようにしましょう。
(一般的なHTTPステータスコードとその意味は、参考資料の「HTTP レスポンスステータスコード」参考にしてみてください)
一例:
- [404] の場合:
指定したヘルスチェックパスに、応答を返すWebページが存在していないことを示します。例えばヘルスチェックパスが「/」である場合は、EC2 インスタンス内のドキュメントルートに index.html 等のWebページが存在しているか確認しましょう。 -
[403] の場合:
指定したヘルスチェックパスに、権限の問題でアクセスできないことを示します。EC2 内のWebページに何らかのアクセス制限を設けている場合は、制限にかからないヘルスチェック専用の静的ページ(healthcheck.html等)を設置し、ヘルスチェックパスをそちらへ変更することも検討しましょう。 -
[301]や[302] の場合:
指定したヘルスチェックパスに、リダイレクトが設定されていることを示します。ヘルスチェックパスには常に200のステータスコードを返す静的ページを設定しましょう。※ ヘルスチェックの成功コードは任意に指定できるため、例えばリダイレクトを許容したい場合は成功コードの範囲に 300 系を含めることで、301 や 302 のレスポンスでもヘルスチェック成功と見なす設定が可能です。
ただしその場合、もしリダイレクト先のWebページで問題が発生していてもヘルスチェックには成功する、という分かりにくい状況になってしまうため、一般的には成功コードを 200 にすることが推奨されます。
上記を解決し、EC2 からステータスコード 200 が返るように修正すれば、ALB のヘルスチェックは healthy になるはずです。
この情報がお役に立てば幸いです。
参考資料
ターゲットグループのヘルスチェック - Elastic Load Balancing
HTTP レスポンスステータスコード - HTTP | MDN